package fiuba.algo3.controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;

import fiuba.algo3.Juego;
import fiuba.algo3.caso.OrdenDeArresto;
import fiuba.algo3.Partida;
import fiuba.algo3.Sospechoso;
import fiuba.algo3.mundo.Pais;
import fiuba.algo3.vista.Vista;
import fiuba.algo3.vista.VistaVentanas;

public class ControladorMouse implements Controlador{

	
	
	public void asignarBotones(final VistaVentanas vista, final Partida partida)
	{
		
	
		vista.setearBotonesPrincipales(crearBotonesPrincipales(partida, vista));
		vista.setearBotonesInvestigacion(crearBotonesInvestigacion(partida, vista));
		vista.setearBotonesSexo(crearBotonesSexo(partida, vista));
		vista.setearBotonesHobby(crearBotonesHobby(partida, vista));
		vista.setearBotonesCabello(crearBotonesCabello(partida, vista));
		vista.setearBotonesSenia(crearBotonesSenia(partida, vista));
		vista.setearBotonesVehiculo(crearBotonesVehiculo(partida, vista));
		vista.setearBotonesFinDePartida(crearBotonesFinDePartida(partida, vista));
		vista.setearBotonJugar(crearBotonJugar(partida, vista));

	}
	
	public void asignarPrimerBoton(VistaVentanas vista) {
		vista.setearBotonOK(crearBotonOk(vista));
		
	}
	
	private JButton crearBotonOk(final VistaVentanas vista) {
		JButton bOK = new JButton("OK");
		bOK.addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
		    	
		    	
				Juego.jugarPartidaVentanas(recibirNombreJugador(vista));
				
		    }
		});
		
		return bOK;
		
	}
	
	private JButton crearBotonJugar(final Partida partida, final VistaVentanas vista) {
		JButton bJugar = new JButton("Jugar");
		bJugar.addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				vista.mostrarMenuPrincipal(partida);
				
		    }
		});
		
		return bJugar;
		
	}

	private List<JButton> instanciarBotonesFinPartida() {
		
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Si"));
		lb.add( new JButton("No"));

		System.out.println("Instancio los botones FP");

		return lb;
	}

	private List<JButton> instanciarBotonesVehiculo() {
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Convertible"));
		lb.add( new JButton("Limusina"));
		lb.add( new JButton("Moto"));

		
		return lb;
	}

	private List<JButton> instanciarBotonesSenia() {
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Joyas"));
		lb.add( new JButton("Tatuaje"));
		lb.add( new JButton("Anillo"));

		
		return lb;
	}

	private List<JButton> instanciarBotonesCabello() {
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Negro"));
		lb.add( new JButton("Rojo"));
		lb.add( new JButton("Rubio"));

		
		return lb;
	}

	private List<JButton> instanciarBotonesHobby() {
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Tenis"));
		lb.add( new JButton("Alpinismo"));
		lb.add( new JButton("Croquet"));

		
		return lb;
	}

	private List<JButton> instanciarBotonesSexo() {
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Masculino"));
		lb.add( new JButton("Femenino"));
		
		return lb;
	}

	private List<JButton> instanciarBotonesInterpol(Partida partida) {
		List<JButton> lb= new ArrayList<JButton>();
		
		lb.add( new JButton("Seleccionar Sexo - " + OrdenDeArresto.obtenerSexo()));
		lb.add( new JButton("Seleccionar Hobby - " + OrdenDeArresto.obtenerHobby()));
		lb.add( new JButton("Seleccionar Cabello - " + OrdenDeArresto.obtenerCabello()));			
		lb.add( new JButton("Seleccionar Senia - " + OrdenDeArresto.obtenerSenia()));	
		lb.add( new JButton("Seleccionar Vehiculo - " + OrdenDeArresto.obtenerVehiculo()));
		lb.add( new JButton("Buscar sospechosos coincidentes"));
		lb.add( new JButton("Volver al menu anterior"));
		
		
		return lb;
	}

	private List<JButton> instanciarBotonesViajar(Partida partida) {
		
		List<JButton> lb= new ArrayList<JButton>();
		Pais[] listaPaises = partida.obtenerPaisesConectados();
	

		for (Pais pais : listaPaises)
		{
			lb.add(new JButton("Ir a: " + pais.obtenerNombre()));
			
		}
		
		
		return lb;
	}

	private List<JButton> instanciarBotonesInvestigacion() {
		
		List<JButton> lb= new ArrayList<JButton>();
		lb.add( new JButton("Biblioteca"));
		lb.add( new JButton("Banco"));
		lb.add( new JButton("Puerto"));			
		lb.add( new JButton("Atras"));	
		return lb;
	}

	private List<JButton> instanciarBotonesPrincipales() {
		List<JButton> bPrincipales= new ArrayList<JButton>();

		bPrincipales.add( new JButton("Investigar"));
		bPrincipales.add( new JButton("Viajar"));
		bPrincipales.add( new JButton("Acceder al sistema de la Interpol"));	
		
		return bPrincipales;
	}

	
	
	
	
	private List<JButton> crearBotonesFinDePartida(final Partida partida, final VistaVentanas vista) {
		List<JButton> bFin = instanciarBotonesFinPartida();
		
		bFin.get(0).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
		    	vista.esconderPopUpFinDePartida();
				Juego.jugarPartidaVentanas(partida.obtenerNombreJugador());
				
		    }
		});
		
		bFin.get(1).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
		    	System.exit(0);
		    }
		});
		
				return bFin;
	}

	private List<JButton> crearBotonesVehiculo(final Partida partida, final VistaVentanas vista) {
		List<JButton> bV = instanciarBotonesVehiculo();
		
		bV.get(0).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

			OrdenDeArresto.seleccionarVehiculo("convertible");
			recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bV.get(1).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarVehiculo("limusina");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bV.get(2).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarVehiculo("moto");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		return bV;
	}

	private List<JButton> crearBotonesSenia(final Partida partida, final VistaVentanas vista) {
		List<JButton> bS = instanciarBotonesSenia();
		
		bS.get(0).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

			OrdenDeArresto.seleccionarSenia("joyas");
			recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bS.get(1).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarSenia("tatuaje");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bS.get(2).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarSenia("anillo");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		return bS;
	}

	private List<JButton> crearBotonesCabello(final Partida partida, final VistaVentanas vista) {
		List<JButton> bC = instanciarBotonesCabello();
		
		bC.get(0).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

			OrdenDeArresto.seleccionarCabello("negro");
			recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bC.get(1).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarCabello("rojo");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bC.get(2).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarCabello("rubio");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		return bC;
	}

	private List<JButton> crearBotonesHobby(final Partida partida, final VistaVentanas vista) {
		List<JButton> bH = instanciarBotonesHobby();
		
		bH.get(0).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

			OrdenDeArresto.seleccionarHobby("tenis");
			recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bH.get(1).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarHobby("alpinismo");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bH.get(2).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarHobby("croquet");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		return bH;
	}

	private List<JButton> crearBotonesSexo(final Partida partida, final VistaVentanas vista) {
		
		List<JButton> bS = instanciarBotonesSexo();
		
		bS.get(0).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

			OrdenDeArresto.seleccionarSexo("masculino");
			recibirComandoInterpol(partida, vista);
			
			}
		});
		
		bS.get(1).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				OrdenDeArresto.seleccionarSexo("femenino");
				recibirComandoInterpol(partida, vista);
			
			}
		});
		
		return bS;
	}

	private List<JButton> crearBotonesInterpol(final Partida partida, final VistaVentanas vista) {
		
		List<JButton> bInterpol = instanciarBotonesInterpol(partida);
		
		bInterpol.get(0).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				vista.mostrarOpcionesSexo();
			
			}
		});
		
		bInterpol.get(1).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				vista.mostrarOpcionesHobby();
			
			}
		});
		
		bInterpol.get(2).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				vista.mostrarOpcionesCabello();
			
			}
		});
		
		bInterpol.get(3).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				vista.mostrarOpcionesSenia();
			
			}
		});
		
		bInterpol.get(4).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {

				vista.mostrarOpcionesVehiculo();
			
			}
		});
		
		bInterpol.get(5).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				
				Sospechoso[] lista = partida.generarListaDeSospechosos();
				vista.mostrarListaDeSospechosos(lista);
				vista.mostrarTiempoYPais(partida);
				
				if(partida.perdioPartida())
					vista.mostrarFinPartida();

			
			}
		});
		
		bInterpol.get(6).addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				
				recibirComandoPrincipal(vista, partida);
			
			}
		});
	
	return bInterpol;
		

	}

	private List<JButton> crearBotonesViajar(final Partida partida, final VistaVentanas vista) {
		
		List<JButton> bViajar = instanciarBotonesViajar(partida);
		final Pais[] listaPaises = partida.obtenerPaisesConectados();

		
		
			bViajar.get(0).addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {

		    	partida.irHasta(listaPaises[0]);
		    	recibirComandoPrincipal(vista, partida);
		    	if(partida.perdioPartida())
					vista.mostrarFinPartida();
				
				}
			});
			
			bViajar.get(1).addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {

		    	partida.irHasta(listaPaises[1]);
		    	recibirComandoPrincipal(vista, partida);
		    	if(partida.perdioPartida())
					vista.mostrarFinPartida();
				
				}
			});
			
			bViajar.get(2).addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {

		    	partida.irHasta(listaPaises[2]);
		    	recibirComandoPrincipal(vista, partida);
		    	if(partida.perdioPartida())
					vista.mostrarFinPartida();
				
				}
			});
			
			bViajar.get(3).addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {

		    	partida.irHasta(listaPaises[3]);
		    	recibirComandoPrincipal(vista, partida);
		    	if(partida.perdioPartida())
					vista.mostrarFinPartida();
				
				}
			});
		
		return bViajar;
	}

	
	
	
	private List<JButton> crearBotonesInvestigacion(final Partida partida, final VistaVentanas vista) {
		
		List<JButton> bInv = instanciarBotonesInvestigacion();
		
		bInv.get(0).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				vista.mostrarPista(partida.entrarEnBiblioteca());
				vista.mostrarTiempoYPais(partida);
				
		    	if(partida.perdioPartida()||partida.ganoPartida())
					vista.mostrarFinPartida();
				
		    }
		});
		
		bInv.get(1).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				vista.mostrarPista(partida.entrarEnLugarEconomia());
				vista.mostrarTiempoYPais(partida);
				
				if(partida.perdioPartida()||partida.ganoPartida())
					vista.mostrarFinPartida();
				
		    }
		});
		
		bInv.get(2).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				vista.mostrarPista(partida.entrarEnLugarViajes());
				vista.mostrarTiempoYPais(partida);
				
				if(partida.perdioPartida()||partida.ganoPartida())
					vista.mostrarFinPartida();
				
		    }
		});
		
		bInv.get(3).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				recibirComandoPrincipal(vista, partida);
		    }
		});
		
		return bInv;
	}

	private List<JButton> crearBotonesPrincipales(final Partida partida, final VistaVentanas vista) {
		
		List<JButton> bPrincipales = instanciarBotonesPrincipales();
		
		bPrincipales.get(0).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				recibirComandoInvestigacion(partida, vista);
		    }
		});
		
		bPrincipales.get(1).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				recibirComandoViajar(partida, vista);
		    }
		});
		
		bPrincipales.get(2).addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent event) {
				recibirComandoInterpol(vista, partida);
		    }
		});	
		
		return bPrincipales;
		
	}

	
	
	
	@Override
	public boolean recibirComandoFinDePartida() {

		return false;
		
	}

	@Override
	public void recibirComandoPrincipal(Vista vista, Partida partida) {
		
		recibirComandoPrincipal((VistaVentanas)vista, partida);
	}
	
	private void recibirComandoPrincipal(VistaVentanas vista, Partida partida)
	{
		System.out.println("LLego a recibirComandoP");//DEBUG
		
		vista.mostrarMenuPrincipal(partida);

		
	}

	public void recibirComandoInterpol(Partida partida, VistaVentanas vista) {
		vista.setearBotonesInterpol(crearBotonesInterpol(partida, vista));
		vista.mostrarOpcionesInterpol(partida);
		
	}

	@Override
	public void recibirComandoViajar(Partida partida, Vista vista) {

		recibirComandoViajar(partida, (VistaVentanas) vista);
	}
	
	public void recibirComandoViajar(Partida partida, VistaVentanas vista) {
		
		vista.setearBotonesViajar(crearBotonesViajar(partida, vista));
		vista.mostrarOpcionesViajar(partida);
	}

	@Override
	public void recibirComandoInvestigacion(Partida partida, Vista vista) {
		
		recibirComandoInvestigacion(partida, (VistaVentanas)vista);
	}
	
	public void recibirComandoInvestigacion(final Partida partida, final VistaVentanas vista) {
				
			
		vista.mostrarOpcionesInvestigacion(partida);		
		
		
		
	}
	
	

	
	public String recibirNombreJugador(VistaVentanas vista) {
		return vista.obtenerTextField();
	}
	
	@Override
	public String recibirNombreJugador() {
	
		return null;
	}

	
	@Override
	public void recibirOK(Vista v) {
		
			
			JButton botonOK = new JButton("OK");
				
				botonOK.addActionListener(new ActionListener() {
				    @Override
				    public void actionPerformed(ActionEvent event) {
				    	
				    	
				    }
				});
				
				v.mostrarBotonOK(botonOK);

				
	}

	@Override
	public boolean recibirComandoInterpol(Vista vista, Partida partida) {
		recibirComandoInterpol(partida, (VistaVentanas)vista);
		return false;
	}





}
